package com.tsingning.generator;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author asus-55
 */
public class CodeGenerator {
    public static void main(String[] args) {

        // 获取项目路径
        String projectPath = System.getProperty("user.dir");
        // 获取java目录
        String objPath = projectPath + "/src/main/java";
        // 配置包路径
        String parentPackage = "com.tsingning.modules";

        String[] tableNames = new String[]{
                "sys_department",
                "sys_permission",
                "sys_role",
                "sys_role_permission",
                "sys_user",
                "t_device",
                "t_device_group",
                "t_device_label",
                "t_device_type",
                "t_gateway",
                "t_group",
                "t_label",
                "t_log",
                "t_quartz",
                "t_supplier",
                "t_supplier_account",
                "t_tenant"
        };

        mpGenerator(projectPath, objPath, parentPackage, tableNames);
    }

    /**
     * MybatisPlus 代码生成器
     * @param projectPath 项目路径
     * @param objPath 生成位置
     * @param parentPackage 包路径
     * @param tableNames 表名
     * 查询全部表名 “select table_name from information_schema.tables where table_schema='iot'”
     */
    private static void mpGenerator(String projectPath, String objPath, String parentPackage, String[] tableNames) {

        //1、全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig
                .setActiveRecord(false)
                .setEnableCache(false)
                //这个位置的位置是自己项目的路径到java文件夹下
                .setOutputDir(objPath)
                //覆盖生成的文件
                .setFileOverride(true)
                .setIdType(IdType.INPUT)
                .setServiceName("%sService")
                .setBaseResultMap(true)
                .setBaseColumnList(true)
                //这个参数是生成人(如：张三、李四)
                .setAuthor("tsingning")
                .setOpen(false);
        //2、数据源配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();

        //这套配置是MySql的配置
        //这个是做的SSH的连接（useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false）
        dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/iot?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false")
                .setDriverName("com.mysql.cj.jdbc.Driver")
                //数据库登录名
                .setUsername("root")
                //数据库密码
                .setPassword("root")
                .setDbType(DbType.MYSQL);
        //3、策略配置
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig
                .setNaming(NamingStrategy.underline_to_camel)
                .setColumnNaming(NamingStrategy.underline_to_camel)
                .setNaming(NamingStrategy.underline_to_camel)
                .setEntityLombokModel(true)
                //需要导入的表的名称
                .setInclude(tableNames)
                //需要导入表删除前缀（如：xxx_xx,删除完前缀是xx,只剩下表名）
                .setTablePrefix("t_");

        //4、包名策略配置
        PackageConfig packageConfig = new PackageConfig();
        //这个需要改成自己项目的位置
        packageConfig.setParent(parentPackage);
        //Dao层的文件
        packageConfig.setMapper("dao");
        //service层的文件
        packageConfig.setService("service");
        packageConfig.setServiceImpl("service.impl");
        //controller层的文件
        packageConfig.setController("controller");
        //实体类的文件
        packageConfig.setEntity("entity");
        //xml的文件
        packageConfig.setXml("dao");

        //5、整合配置
        AutoGenerator autoGenerator = new AutoGenerator();
        autoGenerator.setGlobalConfig(globalConfig)
                .setDataSource(dataSourceConfig)
                .setStrategy(strategyConfig)
                .setPackageInfo(packageConfig);

        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-rb");
                this.setMap(map);
            }
        };

        // 自定义xml的存放路径
        List<FileOutConfig> focList = new ArrayList<>();
        focList.add(new FileOutConfig("/templates/mapper.xml.vm") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义Mapper.xml文件存放的路径
                return projectPath + "/src/main/resources/mappers/" + tableInfo.getEntityName() + "-mapper.xml";
            }
        });
        cfg.setFileOutConfigList(focList);
        autoGenerator.setCfg(cfg);
        // 关闭默认 xml 生成，调整生成 至 根目录
        TemplateConfig tc = new TemplateConfig();
        tc.setXml(null);

        autoGenerator.setTemplate(tc);
        //6、执行
        autoGenerator.execute();
    }

}
